#!Anaconda/anaconda/python
#coding: utf-8


"""
尝试  wxpython  进行界面编程
size = (宽，高)
模仿制作一个迷你文本编辑器
wxpython 使用文档 ：https://docs.wxpython.org/index.html
查看所有标准ID    : http://docs.wxwidgets.org/2.8.12/wx_stdevtid.html
"""

import wx
import os

#about 按钮显示的信息
information = "easy editor\n"+"author : @Andrew\n"+"date : 2018.3.31"


#声明一个 wx.frame的子类
class my_frame(wx.Frame):
    """simple driver a new class of frame"""
    def __init__(self,parent,title):
        wx.Frame.__init__(self,parent,title=title,pos=(500,300),size=(600,400))

        # 使用文本编辑器，并允许多行输入,后面是文本框的属性
        self.control = wx.TextCtrl(self, -1, u'欢迎使用此软件',size=(200,100),style=(wx.TE_MULTILINE | wx.TE_DONTWRAP | wx.TE_RICH2))
        self.control.SetInsertionPoint(7)   # 设置初始光标点
        self.CreateStatusBar()              # 创建位于窗口底部的状态栏

        #设置文本样式
        points = self.control.GetFont().GetPointSize()
        f = wx.Font(points+2, wx.FONTFAMILY_SCRIPT, wx.NORMAL, wx.NORMAL, False)  #创建一个字体
        self.control.SetStyle(0, self.control.GetLastPosition(), wx.TextAttr("blue", wx.NullColour, f))


        # 设置顶部菜单，每一个都要实例化一个Menu的对象
        file_menu = wx.Menu()
        save_menu = wx.Menu()

        #创建菜单栏
        menu_bar = wx.MenuBar()
        menu_bar.Append(file_menu,u"File")
        menu_bar.Append(save_menu,u"Save")
        self.SetMenuBar(menu_bar)       #在frame中添加菜单栏


        #使用标准ID增加按钮选项
        menu_exit = file_menu.Append(wx.ID_EXIT,"Exit","Termanate the program")
        menu_open = file_menu.Append(wx.ID_OPEN,"Open","open a file")
        menu_new = file_menu.Append(wx.ID_NEW,"New", "build a file")

        file_menu.AppendSeparator() #分隔符
        menu_about = file_menu.Append(wx.ID_ABOUT,"About","information about this program")

        menu_save = save_menu.Append(wx.ID_SAVE, "Save", "save a file")

        #绑定对应按钮的事件
        self.Bind(wx.EVT_MENU, self.on_about,menu_about)
        self.Bind(wx.EVT_MENU, self.on_open, menu_open)
        self.Bind(wx.EVT_MENU, self.on_save, menu_save)
        self.Bind(wx.EVT_MENU, self.on_exit, menu_exit)
        self.Bind(wx.EVT_MENU, self.on_new, menu_new)

#        self.Show(True)


    def on_about(self,about):
        """show a dialog that about the app"""
        dlg = wx.MessageDialog(self,message=information,caption="about small editor",style=wx.OK)
        dlg.ShowModal() #显示对话框
        dlg.Destroy()   #当结束对话后关闭对话框


    def on_exit(self,exit):
        """tips the user sure to exit """
        dlg = wx.MessageDialog(self,u"确定退出?","Exit",wx.OK)
        dlg.ShowModal()     #显示对话框
        dlg.Destroy()       #当结束对话后关闭对话框
        self.Close(True)    #关闭整个frame


    def on_open(self,open_):
        """open a file """
        self.dirname = ''

        dlg = wx.FileDialog(self,message="choose a file",defaultDir=self.dirname,defaultFile="",wildcard="*.*",style=wx.ID_OPEN)

        #如果用户选中了一个文件并打开
        if dlg.ShowModal() == wx.ID_OK:
            self.filename = dlg.GetFilename()
            self.dirname = dlg.GetDirectory()       #选择的文件所在的路径

            self.address = os.path.join(self.dirname,self.filename)
            f = open(self.address,"rb")        #这样可以读取带中文的字符
            file = (f.read()).decode(encoding="gbk")    #使用gbk编码解决无法打开中文文件的问题，Windows就是gbk编码
            f.close()
            self.control.Clear()
            self.control.AppendText(file)       #吧打开文件的内容显示在文本框内
        dlg.Destroy()


    def on_save(self,save):
        """save the file changed above
        if user haven't open a file,save to default path,and tips for input title.
        """
        try:
            data = self.control.GetValue()      #获取文本框中的内容，返回string
            f = open(self.address,'w')          #写方式打开
            f.write(data)
            f.close()

            dlg = wx.MessageDialog(self,u"文件已经成功保存",u"保存成功",wx.OK)
            dlg.ShowModal()
            dlg.Destroy()

        except:
            filename = ""
            new_data = self.control.GetValue()

            dlg = wx.TextEntryDialog(self,message=u"请输入一个文件名",caption=u"请输入",value="new")
            if dlg.ShowModal() == wx.ID_OK:
                ok = wx.MessageDialog(self,u"保存成功！",u"保存",wx.OK)
                ok.ShowModal()
                ok.Destroy()
                dlg.Destroy()

            self.filename = dlg.GetValue() + ".txt"
            self.address = os.path.join(os.getcwd(),self.filename)

            f = open(self.address,"w")        #直接新建一个文件
            f.write(new_data)
            f.close()

    def on_new(self,_new):
        """build a new file"""
        filename = ""
        #显示一个带单行输入的对话框
        dlg = wx.TextEntryDialog(self,message=u"请输入文件名：",caption=u"新建",value="new")

        if dlg.ShowModal() == wx.ID_OK:
            dlg.Destroy()

        self.filename_new = dlg.GetValue() + ".txt"   #获取用户输入的文件名，并默认为TXT文件
        self.address = os.path.join(os.getcwd(), self.filename_new)     #把新建文本加入路径

        self.control.Clear()


class main_app(wx.App):
    def OnInit(self):       # OnInit 方法在主事件循环开始前被wxPython系统调用，是wxpython独有的
        self.frame = my_frame(parent=None,title="Easy Editor")
        self.frame.Show(True)
        return True


def main():
    app = main_app()
    app.MainLoop()      #开始了一个wxpython进程


if __name__ == "__main__":
    main()




